package com.hns.can.common.service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.hns.can.base.entity.SysUserEntity;
import com.hns.can.common.aop.orgTree.LeftOrgAnnotation;
import com.hns.can.common.enumrate.IndexPageSearchTime;
import com.hns.can.common.formula.FillCodeDscValue;
import com.hns.can.common.vo.CommonParamsVo;
import com.hns.frame.enumrate.MsgType;
import com.hns.frame.exception.BusinessException;
import com.hns.frame.service.CommonService;
import com.hns.tool.pub.DateTool;
import com.hns.tool.pub.PubUtil;
import com.hns.tool.pub.SearchConditionVo;

/**
 * 通用参数处理类
 * @author:Fisher
 * @email:zhuangcaijin@126.com
 * @version Revision 2.0.0
 */
@Component
public class CommonInitParamService extends CommonService{
    
//    @Autowired
//    private CommonExportService commonExportService;
    
    @Autowired
    private FillCodeDscValue codeDscValue;
    
    /**
     * @param params
     * @param request
     * @param tabList
     * @author:zy
     * @email:zhangyu2222z@sina.cn
     * @创建日期:2014-10-30
     * @功能说明：初始化参数限定最小级别为司机
     */
    public void initParams(CommonParamsVo params, SysUserEntity user, List<String> tabList){
        verifyParams(params);
        List<String> orgIds = null;
        if (PubUtil.isNotEmpty(params.getLineIds()) ) {
            orgIds = Arrays.asList(params.getLineIds());
        }
        //如果选择车辆，覆盖机构list，设置线路id属性为空
        if (PubUtil.isNotEmpty(params.getCarIds()) ) {
            orgIds = Arrays.asList(params.getCarIds());
        }
        //判断是否选择了司机，若选择了司机，获取司机所属的车辆id，追加到set，确保临时表中的id唯一性
        if (PubUtil.isNotEmpty(params.getDriverIds()) ) {
            orgIds = Arrays.asList(params.getDriverIds());
        }
        setOrgIds(params, orgIds, user, tabList);
    }
    /**
     * @param params
     * @param request
     * @param tabList
     * @author:zy
     * @email:zhangyu2222z@sina.cn
     * @创建日期:2014-10-30
     * @功能说明：初始化参数限定最小级别为车辆
     */
    public void initParamsLimitCar(CommonParamsVo params, SysUserEntity user, List<String> tabList){
    	verifyParams(params);
        List<String> orgIds = null;
        HashSet<String> orgIdSet = new HashSet<String>();
        //获取左侧树选择的线路id
        if (PubUtil.isNotEmpty(params.getLineIds()) ) {
            orgIds = Arrays.asList(params.getLineIds());
        }
        //如果选择车辆，覆盖机构list，设置线路id属性为空
        if (PubUtil.isNotEmpty(params.getCarIds()) ) {
            orgIdSet.addAll(Arrays.asList(params.getCarIds()));
            orgIds = new ArrayList<String>(orgIdSet);
        }
        //判断是否选择了司机，若选择了司机，获取司机所属的车辆id，追加到set，确保临时表中的id唯一性
        if (PubUtil.isNotEmpty(params.getDriverIds()) ) {
            List<String> carIds = getCarIdByDrvIds(Arrays.asList(params.getDriverIds()));
            orgIdSet.addAll(carIds);
            orgIds = new ArrayList<String>(orgIdSet);
        }
        setOrgIds(params, orgIds, user, tabList);
    }
    
    /**
     * @param params
     * @param request
     * @param tabList
     * @author:zy
     * @email:zhangyu2222z@sina.cn
     * @创建日期:2014-11-27
     * @功能说明：只校验线路级别初始化参数
     */
    public void initParamsLimitLine(CommonParamsVo params, SysUserEntity user, List<String> tabList){
        verifyParamsLimitLine(params);
        List<String> orgIds = null;
        if (PubUtil.isNotEmpty(params.getLineIds()) ) {
            orgIds = Arrays.asList(params.getLineIds());
        }
        setOrgIds(params, orgIds, user, tabList);
    }
    
    
    /**
     * @param params
     * @param orgIds
     * @param request
     * @param tabList
     * @author:zy
     * @email:zhangyu2222z@sina.cn
     * @创建日期:2014-10-30
     * @功能说明：添加机构id参数
     */
    public void setOrgIds(SearchConditionVo params, List<String> orgIds, SysUserEntity user, List<String> tabList){
    	if(PubUtil.isNotEmpty(orgIds)){
    		params.setOrgIds(orgIds);
    	}
    	try{
    	    if(PubUtil.isEmpty(params.getCorpId())){
                params.setCorpId(user.getCorpId());
            }
    	}catch(Exception e){
    		params.setCorpId("-1");
    	}
    	params.setDriverRelTableListName(tabList);
    }
   
    /**
     * 校验参数
     * @param params
     * @return
     * @author:zhangzq
     * @email:
     */
    private void verifyParams(CommonParamsVo params){
        if(PubUtil.isEmpty(params.getCarIds())&&PubUtil.isEmpty(params.getDriverIds())&&PubUtil.isEmpty(params.getLineIds())){
            throw new BusinessException(MsgType.WARN.getFlag(), "请选择查询车辆/机构/驾驶员!");
        }
        //如果没选择时间不执行查询
        if(PubUtil.isEmpty(params.getBeginTime()) || PubUtil.isEmpty(params.getEndTime())){
            throw new BusinessException(MsgType.WARN.getFlag(), "请选择起止时间!");
        }
    }
    
    /**
     * @author:zy
     * @email:zhangyu2222z@sina.cn
     * @创建日期:2014-11-27
     * @功能说明：只校验线路
     */
    private void verifyParamsLimitLine(CommonParamsVo params){
        if(PubUtil.isEmpty(params.getLineIds())){
            throw new BusinessException(MsgType.WARN.getFlag(), "请选择至少一条线路!");
        }
        if(PubUtil.isEmpty(params.getBeginTime()) || PubUtil.isEmpty(params.getEndTime())){
            throw new BusinessException(MsgType.WARN.getFlag(), "请选择起止时间！");
        }
    }
    
//    /**
//     * @param list
//     * @param changedColVal
//     * @return
//     * @throws QueryExprException
//     * @author:zy
//     * @email:zhangyu2222z@sina.cn
//     * @创建日期:2014-10-30
//     * @功能说明：公式注入
//     */
//    @SuppressWarnings("static-access")
//    public <T> List<T> formularOperation(List<T> list,String[] changedColVal) throws QueryExprException {
//        QueryFormula queryFormula = new QueryFormula();
//        queryFormula.execFormula(list, changedColVal);
//        return list;
//    }
    
    
//    /**
//     * @author:zhangy
//     * @param List<BaseEntity>
//     * @email:zhangyu2222z@sina.cn
//     * @创建日期:2014年12月29日
//     * @功能说明：初始化描述表对应字段值
//     */
//    @SuppressWarnings({ "unchecked", "rawtypes" })
//	public List initDscValue(List list, String colName, String valueName, String[] changedColVal) throws QueryExprException {
//    	Map<String,String> mapTmp = new HashMap<String,String>();
//        mapTmp.put(colName, valueName);
//        list = formularOperation(list, changedColVal);
//        codeDscValue.fillCodeDscValue(list, mapTmp);
//        
//        
//        return list;
//    }
    
    /**
     * @param entity
     * @return
     * @author:zhangy
     * @email:zhangyu2222z@sina.cn
     * @创建日期:2015年3月19日
     * @功能说明：获取用户拥有资源权限
     */
    @SuppressWarnings("unchecked")
	public void getResourcePmsByUser(SearchConditionVo entity, HttpServletRequest request){
    	SysUserEntity user = (SysUserEntity)request.getSession().getAttribute("SES_CURRENTUSER");
    	if(PubUtil.isEmpty(user)){
    		user = (SysUserEntity)request.getSession().getAttribute("PHONE_CURRENTUSER");
    	}
//    	CommonParamsVo params = (CommonParamsVo)entity;
//    	if(PubUtil.isEmpty(entity)){
//    		params.setType("CAR");
//    	}
    	
    	entity.setUserid(user.getId());
    	List<String> list = sqlMapDao.selectList("baseOrgan.getResourcePmsByUser", entity);
    	entity.setOrgIds(list);
//    	if(type.equals("DRIVER")){
//    	}else if(type.equals("CAR")){
//    		entity.setOrgIds(list);
//    	}else{
//    		entity.setOrgIds(list);
//    	}
    }
    
    /**
     * @author:zy
     * @email:zhangyu2222z@sina.cn
     * @创建日期:2014-8-27
     * @功能说明：根据司机查询对应车
     */
    @SuppressWarnings("unchecked")
    @LeftOrgAnnotation()
    @Transactional
    public List<String> getCarIdByDrvIds(List<String> orgIds){
        return sqlMapDao.selectList("baseCarInfo.getCarIdByDrvIds");
    }
    
    
    /**
     * @param entity
     * @author:zhangy
     * @email:zhangyu2222z@sina.cn
     * @创建日期:2015年4月16日
     * @功能说明：判断关联查询条件类型，设置对应类型标记
     */
    public void initQueryTableCondition(CommonParamsVo entity){
    	String[] arr = new String[]{"TYPE"};
    	if(PubUtil.isEmpty(entity.getType())||entity.getType().equals("CAR")){
    		entity.setCarIds(arr);
		}else if(entity.getType().equals("DRIVER")){
			entity.setDriverIds(arr);
		}else if(entity.getType().equals("LINE")){
			entity.setLineIds(arr);
		}
    }
    
    /**
     * @param params
     * @param dateType
     * @author:zhangy
     * @email:zhangyu2222z@sina.cn
     * @创建日期:2015年6月9日
     * @功能说明：日期类型转化成详细起止时间
     */
    public void dateType2DateTime(SearchConditionVo params, String dateType){
    	GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();
    	if(PubUtil.isEmpty(dateType)){
    		dateType = "02";
    	}
    	//今天
    	if(dateType.equals(IndexPageSearchTime.TODAY.getFlag())){
    		cal.add(Calendar.DATE, 0);
    		params = DateTool.getDayDuring(params, cal.getTime());
    	}
    	//昨天
    	else if(dateType.equals(IndexPageSearchTime.LAST_DAY.getFlag())){
    		cal.add(Calendar.DATE, -1);
    		params = DateTool.getDayDuring(params, cal.getTime());
    	}
    	//近七天
    	else if(dateType.equals(IndexPageSearchTime.SEVEN_DAYS.getFlag())){
    		params = DateTool.getSevenDays(params);
    	}
    	//本月
    	else if(dateType.equals(IndexPageSearchTime.THIS_MONTH.getFlag())){
    		cal.add(Calendar.MONTH, 0);
    		params = DateTool.getMonthDuring(params, cal.getTime());
    	}
    	//上月
    	else if(dateType.equals(IndexPageSearchTime.LAST_MONTH.getFlag())){
    		cal.add(Calendar.MONTH, -1);
    		params = DateTool.getMonthDuring(params, cal.getTime());
    	}
    	//今年
    	else if(dateType.equals(IndexPageSearchTime.THIS_YEAR.getFlag())){
    		cal.add(Calendar.YEAR, 0);
    		params = DateTool.getYearDuring(params, cal.getTime());
    	}
    	//去年
    	else if(dateType.equals(IndexPageSearchTime.LAST_YEAR.getFlag())){
    		cal.add(Calendar.YEAR, -1);
    		params = DateTool.getYearDuring(params, cal.getTime());
    	}
    }
}
